<?php

/**
 * Created by PhpStorm.
 * User: colin
 * Date: 15-4-1
 * Time: 21:26
 */

namespace common\repositories;

use yii\base\Model;

class BaseRepository extends Model {

    use \common\error\ReturnErrorTrait;


    /**
     * 合并两个结果集LeftJoin
     * @param array $array_left     左表
     * @param array $array_right    右表
     * @param string $left_key      左表Pk
     * @param string $right_key     右表Fk
     * @param array $select_columns 查询字段
     * @return array
     */
    public function array_left_join($array_left, $array_right, $left_key, $right_key, $select_columns) {
        return $this->join($array_left, $array_right, $left_key, $right_key, $select_columns, true);
    }

    /**
     * 合并两个结果集LeftJoin
     * @param array $array_left     左表
     * @param array $array_right    右表
     * @param string $left_key      左表Pk
     * @param string $right_key     右表Fk
     * @param array $select_columns 查询字段
     * @return array
     */
    public function array_inner_join($array_left, $array_right, $left_key, $right_key, $select_columns) {
        return $this->join($array_left, $array_right, $left_key, $right_key, $select_columns, false);
    }

    /**
     * 生成错误
     * @param $msg
     * @return \Exception
     */
    public function throwException($msg){
        if(is_array($msg) || is_object($msg)) {
            $msg = json_encode($msg, JSON_UNESCAPED_UNICODE);
        }
        return new \Exception($msg);
    }

    private function join($array_left, $array_right, $left_key, $right_key, $select_columns, $allow_not_match) {
        $data = array();

        // 不处理空结果集
        if (count($array_left) == 0 || count($array_right) == 0) {
            if ($allow_not_match && count($array_left) > 0) {
                foreach ($select_columns as $sc) {
                    if (!array_key_exists($sc, $array_left[0])) {
                        // 如果查询字段列不存在的话，补充上（一般来说这些列都是右表的字段，因为没有参与Join，所以需要补充上）
                        foreach ($array_left as &$item) {
                            $item[$sc] = null;
                        }
                    }
                }

                return $array_left;
            } else {
                return $data;
            }
        }

        foreach ($array_left as $item_left) {
            $temp = array();
            // 将左边中的查询字段放入数组中
            foreach ($select_columns as $sc) {
                if (array_key_exists($sc, $item_left)) {
                    $temp[$sc] = $item_left[$sc];
                }
            }

            $find_out = false;
            // 循环所有右表的记录，寻找匹配
            foreach ($array_right as $item_right) {
                $copy = $temp;
                if (strtoupper($item_right[$right_key]) == strtoupper($item_left[$left_key])) {
                    $find_out = true;
                    foreach ($select_columns as $sc) {
                        if (!array_key_exists($sc, $copy)) {
                            // 主从表字段重名时，不处理从表的数据
                            $copy[$sc] = $item_right[$sc];
                        }
                    }

                    // left_join，可能存在一对多的情况
                    array_push($data, $copy);
                }
            }

            if (false == $find_out && true == $allow_not_match) {
                // 没有找到对应右表的记录
                foreach ($select_columns as $sc) {
                    if (!array_key_exists($sc, $copy)) {
                        // 主从表字段重名时，不处理从表的数据
                        $copy[$sc] = null;
                    }
                }
                array_push($data, $copy);
            }
        }

        return $data;
    }

}
